import { useCallback, useEffect, useState } from "react";
import { ITodo } from "types/todo";
import { loadTodos, saveTodos } from "storage";
import dayjs from "dayjs";

export const useTodos = () => {
  const [todoMsg, setMessage] = useState("");
  const [todos, setTodos] = useState<ITodo[]>(loadTodos());

  // 查询todo
  const listTodos = useCallback(() => {
    setTodos(loadTodos());
  }, []);

  // 新增todo
  const addTodoToList = useCallback(
    (content: string) => {
      setMessage("");
      // 判断是否重名
      for (const todo of todos) {
        if (todo.content === content.trim()) {
          setMessage("任务不得重名!");
          return;
        }
      }

      let todo: ITodo = {
        id: (Math.random() + "").slice(2),
        content: content.trim(),
        importantSign: false,
        finishedSign: false,
        createdAt: dayjs().toDate(),
        finishedAt: dayjs().toDate(),
      };
      setTodos([...todos, todo]);
    },
    [setTodos, todos]
  );

  // 删除todo
  const deleteOneTodo = useCallback(
    (removeTodo: ITodo) => {
      const newTodos: ITodo[] = [];
      todos.forEach((todo) => {
        todo.id === removeTodo.id ? newTodos.push() : newTodos.push(todo);
      });
      setTodos(newTodos);
    },
    [todos, setTodos]
  );

  // 编辑todo内容
  const updateTodoContent = useCallback(
    (todo: ITodo) => {
      // 判断是否重名
      for (const item of todos) {
        if (item.content.trim() === todo.content.trim()) {
          setMessage("任务不得重名!");
          return;
        }
      }
      const newTodos: ITodo[] = [];
      todos.forEach((item) => {
        if (item.id === todo.id) {
          item.content = todo.content;
        }
        newTodos.push(item);
      });
      setTodos(newTodos);
    },
    [todos]
  );

  // todo标记完成
  const toggleTodoFinish = useCallback(
    (todo: ITodo) => {
      const newTodos: ITodo[] = [];
      todos.forEach((item) => {
        if (item.id === todo.id) {
          item.finishedSign = todo.finishedSign;
          item.finishedAt = dayjs().toDate();
        }
        newTodos.push(item);
      });
      setTodos(newTodos);
    },
    [todos]
  );

  // todo标记重要
  const toggleTodoImportant = useCallback(
    (todo: ITodo) => {
      const newTodos: ITodo[] = [];
      todos.forEach((item) => {
        if (item.id === todo.id) {
          item.importantSign = todo.importantSign;
        }
        newTodos.push(item);
      });
      setTodos(newTodos);
    },
    [todos]
  );

  useEffect(() => {
    saveTodos(todos);
  }, [todos]);

  useEffect(() => {
    listTodos();
  }, [listTodos]);

  return {
    todos,
    todoMsg,
    listTodos,
    addTodoToList,
    deleteOneTodo,
    updateTodoContent,
    toggleTodoFinish,
    toggleTodoImportant,
  };
};
